package leetcode.editor.cn;

import sun.security.util.ArrayUtil;

/**
 * [367]有效的完全平方数
 * valid-perfect-square
 */
//给定一个 正整数 num ，编写一个函数，如果 num 是一个完全平方数，则返回 true ，否则返回 false 。 
//
// 进阶：不要 使用任何内置的库函数，如 sqrt 。
// 示例 1：
//输入：num = 16
//输出：true
// 示例 2：
//输入：num = 14
//输出：false
//
// 提示：
// 1 <= num <= 2^31 - 1 
// 
// Related Topics 数学 二分查找 
// 👍 277 👎 0

public class LC367_ValidPerfectSquare {
    public static void main(String[] args) {
        Solution solution = new LC367_ValidPerfectSquare().new Solution();
        int num = 104976;
        boolean result = solution.isPerfectSquare(num);
        System.out.println("result = " + result);
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public boolean isPerfectSquare(int num) {
            if (num == 1){
                return true;
            }
            //二分查找
            int high = num / 2;
            int low = 1;
            long mid = low + (high - low) / 2;
            while (low <= high){
//                System.out.println("low = " + low);
//                System.out.println("high = " + high);
//                System.out.println("mid = " + mid);
                if (mid * mid == num){
                    return true;
                }else if (mid * mid < num){
                    //中间值小于查找值，说明查找值在中间值右边
                    low = (int)mid + 1;
                    mid = low + (high - low) / 2;
                }else {
                    //中间值大于查找值，说明查找值在中间值左边
                    high = (int)mid - 1;
                    mid = low + (high - low) / 2;
                }
            }
            return false;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}